#include <iostream>
#include <unistd.h>
#include <signal.h>

using namespace std;


void PrintPend(sigset_t pending)
{
    for(int signo = 31; signo > 0;signo--)
    {
        if(sigismember(&pending,signo))
        {
            cout<<"1";
        }
        else{
            cout<<"0";
        }
    }
    cout<<endl;
}


void handler(int signo)
{
    //先修改位图，开始先执行处理动作 （先修改位图）
    sigset_t pending;
    sigpending(&pending);
    cout<<"********************************"<<endl;
    PrintPend(pending);
    cout<<"********************************"<<endl;
    cout << "signo :" << signo << endl;
}




int main()
{

    // signal(2,handler);  


    // //现象：由于2号信号被屏蔽，所以信号会保存到pending信号集中，一直处于未决状态，直到对信号接触屏蔽，接触屏蔽后立即处理该信号
    // sigset_t set, oset;
    // sigemptyset(&set);
    // sigemptyset(&oset);
    // sigaddset(&set,2);
    // sigprocmask(SIG_SETMASK,&set,&oset);

    // int cnt = 0;
    // //不断获取pending表
    // while(1)
    // {
    //     sigset_t pending;
    //     sigpending(&pending);
    //     PrintPend(pending);
    //     sleep(1);
    //     cnt++;
    //     if(cnt == 13)
    //     {     
    //         sigprocmask(SIG_SETMASK,&oset,nullptr); //解除屏蔽
    //     }
    // }



    sigset_t block, oblock;

    // 初始化
    sigemptyset(&block);
    sigemptyset(&oblock);

    // sigaddset(&block,2); //将2信号加入位图
    for (int signo = 1; signo <= 31; signo++)
        sigaddset(&block, signo);

    sigprocmask(SIG_BLOCK, &block, &oblock);

    cout << "pid : " << getpid() << endl;
    cout << "我已经屏蔽了所有信号了，我无敌了！" << endl;


    while (true)
    {
        sleep(1);
    }

    // signal(2, handler);

    // sleep(5);
    // cout << "heandler" << endl;

    // signal(2, SIG_IGN);  //信号忽略
    // sleep(5);

    // cout << "sig_ign" << endl;
    // signal(2, SIG_DFL);  //信号的默认处理

    // sleep(5);
    // cout << "getpid : " << getpid() << endl;
    // cout << "getpid : " << getpid() << endl;
    // int s = 10;
    // s /= 0;
    // cout << "getpid : " << getpid() << endl;
    // cout << "getpid : " << getpid() << endl;
    // cout << "getpid : " << getpid() << endl;
    // cout << "getpid : " << getpid() << endl;
    return 0;
}
